#ifndef SKYNET_MODULE_H
#define SKYNET_MODULE_H

struct skynet_context;

typedef void * (*skynet_dl_create)(void);
typedef int (*skynet_dl_init)(void * inst, struct skynet_context *, const char * parm);
typedef void (*skynet_dl_release)(void * inst);
typedef void (*skynet_dl_signal)(void * inst, int signal);

struct skynet_module {
	const char * name; //C模块名
	void * module; //dlopen 打开的动态链接库句柄
	skynet_dl_create create; //name指代文件内的 {%s}_create, 函数指针。
	skynet_dl_init init; //name文件内的 {%s}_init, 函数指针。
	skynet_dl_release release; //name文件内的 {%s}_release, 函数指针。
	skynet_dl_signal signal; //name文件内的 {%s}_signal, 函数指针。
};
//所以我们写一个skynet的C模块时，里面应包含xxx_create, xxx_init, xxx_release, xxx_signal 四个函数，xxx为C模块名以及对应的.so文件名


void skynet_module_insert(struct skynet_module *mod);
struct skynet_module * skynet_module_query(const char * name);
void * skynet_module_instance_create(struct skynet_module *);
int skynet_module_instance_init(struct skynet_module *, void * inst, struct skynet_context *ctx, const char * parm);
void skynet_module_instance_release(struct skynet_module *, void *inst);
void skynet_module_instance_signal(struct skynet_module *, void *inst, int signal);

void skynet_module_init(const char *path);

#endif
